package com.itheima.mobili;

import cn.hutool.core.lang.UUID;
import com.alibaba.dubbo.config.annotation.Reference;
import com.alibaba.fastjson.JSON;
import com.itheima.common.MessageConstant;
import com.itheima.common.RedisConstant;
import com.itheima.common.utils.RedisUtils;
import com.itheima.pojo.Member;
import com.itheima.pojo.Result;
import com.itheima.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;
import java.util.Map;

/**
 * @version V1.0
 * @author: yongjichu
 * @date: 2020/2/6 16:11
 * @description:
 */
@RestController
@RequestMapping("/login")
public class LoginController {
    @Autowired
    private RedisUtils redisUtils;
    @Reference
    private MemberService memberService;
    /**
     * 用户快速登陆时的校验
     * @param deviceId
     * @param map
     * @return
     */
    @RequestMapping("/check")
    public Result check(String deviceId, @RequestBody Map map){
        //校验图片验证码
        String imgCode1= (String) map.get("imgCode");
        //获取存入redis中的图片验证码
        String imgCode = redisUtils.get(deviceId);
        if(imgCode==null || !imgCode1.equals(imgCode) ){
            //能进来说明图片验证码不正确
            return Result.error(false,"图片验证码错误");
        }
        //获取前端的输入的手机号还有验证码
        String telephone = (String) map.get("telephone");
        String validateCode = (String) map.get("validateCode");
        //根据telephone还有业务逻辑码去redis中查询数据
        String code = redisUtils.get(telephone + RedisConstant.SENDTYPE_LOGIN);
        //将前端传过来的验证码validateCode与从redis中获取的验证码code，进行比较
        if(validateCode==null || !code.equals(validateCode)){
            return Result.error(false, MessageConstant.VALIDATECODE_ERROR);
        }
        //能来到这里说明所有验证码已经通过，然后根据手机号查询是否是我们的会员如果不是立马注册成我们的会员
        Member member=memberService.findByTelephone(telephone);
        if(member==null){
            //说明还不是我们的会员，立马注册成为我们的会员
            member=new Member();
            member.setPhoneNumber(telephone);
            member.setRegTime(new Date());
            member=memberService.add(member);
        }
        /**
         * 将用户信息存储到redis中，之前都是存到session中，这次为什么存储到redis中呢，这是因为考虑集群的情况，因为程序要部署到好多服务器上，
         * 如果还存到session中，那么下次请求不一定就会找刚才存session的那台，所以用户还得重新登陆，现在我们随便生成一个token字符串作为存入redis中的key，
         * 将用户信息作为value存入redis，即使现在有很多台服务器部署这个项目，那么进入前首先根据token获取到对应的value如果能获取到说明已经登陆，如果获取不到就说明没登陆
         * 所以我们要将生成的token返回到前端页面，前端页面再把它存入到浏览器中，然后浏览器每次发送请求都带上这个token
         */
        String token= UUID.randomUUID().toString();
        //将用户信息存入redis
        redisUtils.setex(token, JSON.toJSONString(member),60*60*24*15);
        //返回数据，记得将token一块返回
        return Result.success(true,"登陆成功",token);
    }
}
